#include "Tour.h"
#include <cassert>
#include <stdlib.h>


/* Procédure qui va permettre l'initialisation de la structure tour.
 * Elle prend en paramètre un pointeur sur la structure tour et un
 * pointeur sur une structure type. */
void init_tour (Stour* tr, const Stype* ADRESSE_LISTE_TYPES)
{
	// On initialise à -1 les coordonnées (cela ne posera pas de problème
	// puisqu'en cas d'ajout de tour, les coordonnées sont immédiatement mises à jour
	(*tr).X=-1;
	(*tr).Y=-1;
	(*tr).derniertir=0;
	// Pour le moment, on ne connait pas le type de la tour.
	(*tr).ptype=NULL;
	// cela peut sembler bizarre de stocker l'adresse du premier type mais
	// comme les tours sont succeptibles d'évoluer, il faut prévoir qu'elles
	//puissent accéder à tout les types :
	(*tr).plistetype=ADRESSE_LISTE_TYPES;
}

/* Cette fonction est un accesseur, elle va permettre d'acceder au numéro
 * de colonne de l'emplacement de la tour.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Elle renvoie un entier correspondant au numéro de colonne. */
int get_Xtour (const Stour* tr)
{
	return ((*tr).X);
}

/* Cette fonction est un accesseur, elle va permettre d'acceder au numéro
 * de ligne de l'emplacement de la tour.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Elle renvoie un entier correspondant au numéro de ligne. */
int get_Ytour (const Stour* tr)
{
	return ((*tr).Y);
}

/* Cette fonction est un accesseur, elle va permettre d'acceder au moment
 * correspondant à la dernière fois que la tour a tiré.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Elle renvoie un temps correspondant au momment de son dernier tir. */
time_t get_derniertir (const Stour* tr)
{
	return ((*tr).derniertir);
}

/* Cette procédure est un mutateur, elle va permettre de modifier la valeur
 * du temps du dernier tir de la tour.
 * Elle prend en paramètre un pointeur sur une structure tour. */
void set_dernier_tir (Stour* tr, time_t nvotir)
{
	(*tr).derniertir=nvotir;
}

/* Cette fonction est un accesseur, elle va permettre d'acceder au numéro
 * de type d'une tour.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Elle renvoie un entier correspondant au numéro de la tour.
 * Attention, le type devra etre renseigné préalablement à l'appel de cette fonction. */
int get_ptypenum (const Stour* tr)
{
	assert ((*tr).ptype!=NULL);
	return (get_numero ((*tr).ptype));
}

/* Cette fonction est un accesseur, elle va permettre d'acceder à la
 * vitesse de tir d'une tour.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Elle renvoie un entier correspondant à la vitesse de tir de la tour.
 * (c'est à dire qu'une tour ayant 4 en vitesse de tir tirera 4 fois par seconde).
 * Attention, le type devra etre renseigné préalablement à l'appel de cette fonction. */
int get_ptypevitesse (const Stour* tr)
{
	assert ((*tr).ptype!=NULL);
	return (get_vitesse ((*tr).ptype));
}

/* Cette fonction est un accesseur, elle va permettre d'acceder à la portée
 * d'une tour.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Elle renvoie un entier correspondant à la portée de la tour
 * (c'est à dire la distance en nombre de case à laquelle elle peut
 * tirer au maximum).
 * Attention, le type devra etre renseigné préalablement à l'appel de cette fonction. */
int get_ptypeportee (const Stour* tr)
{
	assert ((*tr).ptype!=NULL);
	return (get_portee ((*tr).ptype));
}

/* Cette fonction est un accesseur, elle va permettre d'acceder à la
 * puissance d'une tour.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Elle renvoie un entier correspondant à la force de frappe de la tour
 * (c'est à dire le nombre de vie qu'elle va enlever à la bebete à chaque tir).
 * Attention, le type devra etre renseigné préalablement à l'appel de cette fonction.*/
int get_ptypepuissance (const Stour* tr)
{
	assert ((*tr).ptype!=NULL);
	return (get_puissance ((*tr).ptype));
}

/* Cette fonction est un accesseur, elle va permettre d'acceder au prix
 * d'une tour.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Elle renvoie un entier correspondant au prix d'achat de la tour.
 * Attention, le type devra etre renseigné préalablement à l'appel de cette fonction. */
int get_ptypeprix (const Stour* tr)
{
	assert ((*tr).ptype!=NULL);
	return (get_prix ((*tr).ptype));
}

/* Cette procédure est un mutateur, elle va permettre de modifier les
 * coordonnées et le type de la tour.
 * Elle prend en paramètre un pointeur sur une structure tour, un numéro de tour,
 * une valeur X ert une pour Y (coordonnées).
 * Attention, il ne faudra pas tenter d'appeler cette procédure avec des
 * numéros de types non basiques (différents de 10, 20, 30 ou 40).*/
void set_tour (Stour* tr, int numtour, int X, int Y)
{
	// Il s'agit ici en fait d'inséréer une nouvelle tour, on vérifie
	// donc qu'il s'agisse d'une tour de base :
	assert ((numtour==10)||(numtour==20)||(numtour==30)||(numtour==40));
	// on met ensuite à jour les valeur de coordonnées et de type :
	(*tr).X=X;
	(*tr).Y=Y;
	(*tr).ptype=get_listetype((*tr).plistetype, numtour);
}

/* Cette procédure est un mutateur, elle va permettre de modifier le type
 * d'une tour.
 * Elle prend en paramètre un pointeur sur une structure tour.
 * Attention, on ne devra pas cherche à augmenter des tours qui sont déjà à
 * leur évolution maximale (14, 24, 34, 44). */
void upgrade (Stour* tr)
{
	// on va ici faire évoluer la tour c'est a dire la faire passer d'un
	// certain type au suivant.
	// on récupère donc le numéro de type courant de la tour
	int numtyp;
	numtyp=get_ptypenum(tr);
	// on vérifie qu'elle n'est pas déjà à son évolution maximale
	assert (numtyp!=13);
	assert (numtyp!=23);
	assert (numtyp!=33);
	assert (numtyp!=43);
	// puis on incrémente ce type
	(*tr).ptype=get_listetype((*tr).plistetype, (numtyp+1));
}

